package com.enjoyread.core.manager.impl;

import com.enjoyread.core.entity.SmsLog;
import com.enjoyread.core.manager.intf.AliSmsService;
import com.enjoyread.core.service.intf.SmsLogService;

import com.enjoyread.common.bo.SmsBo;
import com.enjoyread.common.config.RedisKeyConfig;
import com.enjoyread.common.config.SystemConfig;
import com.enjoyread.common.utils.NumUtils;
import com.enjoyread.common.utils.RUtils;
import com.enjoyread.common.utils.StringUtils;
import com.enjoyread.common.vo.R;

import com.enjoyread.core.utils.JedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * @description:
 * @author: Feri(邢朋辉)
 * @time: 2021/10/15 16:32
 */
@Service

public class AliSmsServiceImpl implements AliSmsService {
    @Autowired
    private SmsLogService service;
    @Override
    public R sendRCode(String phone) {
        //1.入参校验
        if(StringUtils.isNotEmpty(phone)){
            //2.正则校验手机号格式
            if(phone.matches("^1{1}[3-9]{1}[0-9]{9}$")){
                //3.生成验证码
                int code= NumUtils.createNum(SystemConfig.ALI_SMSCODE_LEN);

                //4.发送短信
                //if(AliSmsUtils.sendRegisterCode(phone,code)){
                if(true){
                    System.out.println(code);
                    //5.成功，保存验证码到Redis  ,思考哪种类型？ String 每个时间都不一样
                    JedisUtil.addStr(RedisKeyConfig.SMS_RCODE+phone,code+"",RedisKeyConfig.SMS_RCODE_TIME);
                    //6.记录数据到数据库
                    service.save(new SmsLog(phone,SystemConfig.SMS_TYPE_RCODE,"新用户注册，发送验证码",new Date()));
                    //7.返回
                    return RUtils.ok("短信验证码已发送，请查收！");
                }
            }
        }
        return RUtils.fail("亲，非法请求");
    }

    @Override
    public R checkRCode(SmsBo bo) {
        //1.入参校验
        if(bo!=null){
            if(StringUtils.isNotEmpty(bo.getPhone())&&bo.getPhone().matches("^1{1}[3-9]{1}[0-9]{9}$")){
                if(bo.getCode()>0){
                    String key=RedisKeyConfig.SMS_RCODE+ bo.getPhone();
                    //2.校验手机号是否存在验证码
                    if(JedisUtil.checkKey(key)){
                        //3.比较验证码
                        if(bo.getCode()==Integer.parseInt(JedisUtil.getStr(key))){
                            //4.成功，删除验证码 一次性
                            JedisUtil.delKey(key);
                            //5.记录允许注册的手机号,防止未验证 手机号，直接注册
                            JedisUtil.addSet(RedisKeyConfig.REGISTER_PHONES,bo.getPhone());
                            //6.返回
                            return RUtils.ok(null);
                        }
                        return RUtils.fail("验证码有误！");
                    }
                    return RUtils.fail("请先发送验证码！");
                }
                return RUtils.fail("验证码有误！");
            }
            return RUtils.fail("请输入正确的手机号");
        }
        return RUtils.fail("网络异常！");
    }

    @Override
    public R sendLCode(String phone) {
        //1.入参校验
        if(StringUtils.regexPhone(phone)){
            //2.生成验证码
            int code= NumUtils.createNum(SystemConfig.ALI_SMSCODE_LEN);
            //3.发送短信
//                if(AliSmsUtils.sendLoginCode(phone,code)){
            if(true){
                System.err.println(code);
                //4.成功，保存验证码到Redis  ,思考哪种类型？ String 每个时间都不一样
                JedisUtil.addStr(RedisKeyConfig.SMS_LCODE+phone,code+"",RedisKeyConfig.SMS_RCODE_TIME);
                //5.记录数据到数据库
                service.save(new SmsLog(phone,SystemConfig.SMS_TYPE_LCODE,"用户手机号登录，发送验证码",new Date()));
                //6.返回
                return RUtils.ok("短信验证码已发送，请查收！");
            }
        }
        return RUtils.fail("亲，非法请求");
    }

    @Override
    public R sendFCode(String phone) {
        //1.入参校验
        if(StringUtils.regexPhone(phone)) {
            //发送验证码的时候，如果存在就不让发送，但是这种会导致无法再次发送验证码
            //if (!JedisUtil.checkSet(RedisKeyConfig.FIND_PHONES, phone)) {
            //2.生成验证码
            int code = NumUtils.createNum(SystemConfig.ALI_SMSCODE_LEN);
            //3.发送短信
//                if (AliSmsUtils.sendLoginCode(phone, code)) {
            if (true) {
                System.err.println(code);
                //4.成功，保存验证码到Redis  ,思考哪种类型？ String 每个时间都不一样
                JedisUtil.addStr(RedisKeyConfig.SMS_FCODE + phone, code + "", RedisKeyConfig.SMS_RCODE_TIME);
                //5.记录数据到数据库
                service.save(new SmsLog(phone, SystemConfig.SMS_TYPE_FCODE, "用户通过手机号找回密码，发送验证码", new Date()));
                //6.返回
                return RUtils.ok("短信验证码已发送，请查收！");
            }
//            }
//        else {
//                return RUtils.fail("亲，已发送验证码！");
//            }
        }
        return RUtils.fail("亲，非法请求");

    }
}